home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 201-225 / disk_204 / filereq / filereq.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  11KB  |  403 lines

  1. #include "filereq.h"
  2.  
  3. main(argc,argv)
  4. int argc;
  5. char *argv[];
  6. {
  7.     char *name;
  8.     name=(char *) get_file("File requester",150,30);
  9.     if (name!=NULL) printf("%s\n",name);
  10.     exit(0);
  11. }
  12.  
  13. get_file(title,wx,wy)
  14. char *title;
  15. int wx,wy;
  16. {
  17.     struct FileLock *lock;
  18.     struct FileInfoBlock *finfo;
  19.     int gadgetid, x, y, selfile=-1;
  20.     struct Gadget *gad;
  21.     char np[256],op[256];
  22.     BOOL fail=FALSE;
  23.  
  24.     finfo=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),MEMF_CHIP|MEMF_CLEAR);
  25.     IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
  26.     GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);
  27.     DosBase=(struct DosBase *) OpenLibrary("dos.library",0);
  28.     rootnode=(struct RootNode *) DosBase->dl_Root;
  29.     dosinfo=(struct DosInfo *) BADDR(rootnode->rn_Info);
  30.     filewin.Screen=IntuitionBase->ActiveScreen;
  31.     if (wx>374) wx=374; if (wy>48) wy=48;
  32.     filewin.LeftEdge=wx; filewin.TopEdge=wy;
  33.     Window=(struct Window *) OpenWindow(&filewin);
  34.     SetWindowTitles(Window,title,0);
  35.     redir:
  36.     if (pathdobuffer[(strlen(pathdobuffer)-1)]!='/' &&
  37.         pathdobuffer[(strlen(pathdobuffer)-1)]!=':' &&
  38.         strlen(pathdobuffer)>0)
  39.         strcat(pathdobuffer,"/");
  40.     for (x=0;x<10;x++) {
  41.         sprintf(FileGadgetText[x].IText,"                              ");
  42.         RefreshGList(&FileGadget[x],Window,NULL,1);
  43.     }
  44.     RefreshGList(&PathGadget,Window,NULL,1);
  45.     if ((lock=Lock(pathdobuffer,ACCESS_READ))==0) {
  46.         sprintf(pathdobuffer,"");
  47.             lock=Lock(pathdobuffer,ACCESS_READ);
  48.         RefreshGList(&PathGadget,Window,NULL,1);
  49.     }
  50.     UDInfo.VertPot=0; UDInfo.VertBody=0xffff;
  51.     RefreshGList(&UDGadget,Window,NULL,1);
  52.     PathInfo.BufferPos=strlen(pathdobuffer);
  53.     ActivateGadget(&FileSGadget,Window,NULL);
  54.     strcpy(op,pathdobuffer);
  55.     Examine(lock,finfo);
  56.     filecount=0; offset=0; oldoffset=-1; selfile=-1; deviceslisted=FALSE;
  57.     while ((ExNext(lock,finfo))!=0) {
  58.         strcpy(files[filecount].fl_filename,finfo->fib_FileName);
  59.         files[filecount].fl_filetype=finfo->fib_DirEntryType;
  60.         ++filecount;
  61.         if (FMsg=GetMsg(Window->UserPort)) {
  62.             ReplyMsg(FMsg);
  63.             switch (FMsg->Class) {
  64.                 case CLOSEWINDOW:
  65.                     UnLock(lock);
  66.                     fail=TRUE;
  67.                     goto finished;
  68.                     break;
  69.                 case GADGETUP:
  70.                     gad=(struct Gadget *) FMsg->IAddress;
  71.                     gadgetid=gad->GadgetID;
  72.                     switch (gadgetid) {
  73.                         case PATH:
  74.                             if (strcmp(op,pathdobuffer)==0) break;
  75.                             UnLock(lock);
  76.                             if (pathdobuffer[(strlen(pathdobuffer)-1)]!='/' &&
  77.                                 pathdobuffer[(strlen(pathdobuffer)-1)]!=':')
  78.                                 strcat(pathdobuffer,"/");
  79.                             goto redir;
  80.                             break;
  81.                         case FILE:
  82.                             sprintf(filename,"%s%s",pathdobuffer,filedobuffer);
  83.                             UnLock(lock);
  84.                             goto finished;
  85.                             break;
  86.                         case PARENT:
  87.                             if (pathdobuffer[(strlen(pathdobuffer)-1)]!='/') break;
  88.                             for (x=strlen(pathdobuffer)-2;x>=0;x--) {
  89.                                 if (pathdobuffer[x]=='/') {
  90.                                     for (y=0;y<x;y++) np[y]=pathdobuffer[y];
  91.                                     np[y++]='\0';
  92.                                     break;
  93.                                 }
  94.                                 else if (pathdobuffer[x]==':') {
  95.                                     for (y=0;y<=x;y++) np[y]=pathdobuffer[y];
  96.                                     np[y++]='\0';
  97.                                     break;
  98.                                 }
  99.                             }
  100.                             sprintf(pathdobuffer,"%s",np);
  101.                             goto redir;
  102.                         case CANCEL:
  103.                             fail=TRUE;
  104.                             goto finished;
  105.                             break;
  106.                         case OKAY:
  107.                             sprintf(filename,"%s%s",pathdobuffer,filedobuffer);
  108.                             goto finished;
  109.                             break;
  110.                         default:
  111.                             break;
  112.                     }
  113.                     break;
  114.                 default:
  115.                     break;
  116.             }
  117.         }
  118.     }
  119.     UnLock(lock);
  120.     Sort();
  121.     DisplayFiles();
  122.     vertpot=0;
  123.     if (filecount<10) UDInfo.VertBody=0xffff;
  124.     else if (filecount<20) UDInfo.VertBody=0x7fff;
  125.     else UDInfo.VertBody=0xffff/(filecount/10);
  126.     RefreshGList(&UDGadget,Window,NULL,1);
  127.     FOREVER {
  128.         Wait(1<<Window->UserPort->mp_SigBit);
  129.         while (FMsg=GetMsg(Window->UserPort)) {
  130.             ReplyMsg(FMsg);
  131.             switch (FMsg->Class) {
  132.                 case CLOSEWINDOW:
  133.                     fail=TRUE;
  134.                     goto finished;
  135.                     break;
  136.  
  137.                 case MOUSEBUTTONS:
  138.                     if (FMsg->Code!=MENUDOWN) break;
  139.                     if (deviceslisted) break;
  140.                     deviceslisted=TRUE;
  141.                     Forbid();
  142.                     devlist=(struct DeviceList *) BADDR(dosinfo->di_DevInfo);
  143.                     while (devlist) {
  144.                         if (devlist->dl_Type!=NULL) {
  145.                             devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  146.                             continue;
  147.                         }
  148.                         if (devlist->dl_Task) {
  149.                             conbstr((BPTR) devlist->dl_Name,files[filecount].fl_filename);
  150.                             strcat(files[filecount].fl_filename,":");
  151.                             files[filecount].fl_filetype=0;
  152.                             ++filecount;
  153.                         }
  154.                         devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  155.                     }
  156.                     Permit();
  157.                     offset=0; oldoffset=-1; selfile=-1;
  158.                     DisplayFiles();
  159.                     vertpot=0;
  160.                     if (filecount<10) UDInfo.VertBody=0xffff;
  161.                     else if (filecount<20) UDInfo.VertBody=0x7fff;
  162.                     else UDInfo.VertBody=0xffff/(filecount/10);
  163.                     RefreshGList(&UDGadget,Window,NULL,1);
  164.                     ActivateGadget(&PathGadget,Window,NULL);
  165.                     break;
  166.  
  167.                 case GADGETUP:
  168.                     gad=(struct Gadget *) FMsg->IAddress;
  169.                     gadgetid=gad->GadgetID;
  170.                     if (gadgetid<10) {
  171.                         if (offset+gadgetid>=filecount) break;
  172.                         if (files[offset+gadgetid].fl_filetype>0) {
  173.                             if (pathdobuffer[(strlen(pathdobuffer)-1)]!='/' &&
  174.                                 pathdobuffer[(strlen(pathdobuffer)-1)]!=':' &&
  175.                                 strlen(pathdobuffer)>0)
  176.                                 strcat(pathdobuffer,"/");
  177.                                 strcat(pathdobuffer,files[offset+gadgetid].fl_filename);
  178.                                 strcat(pathdobuffer,"/");
  179.                                 goto redir;
  180.                             }
  181.                         else if (files[offset+gadgetid].fl_filetype==0) {
  182.                             sprintf(pathdobuffer,"%s",files[offset+gadgetid].fl_filename);
  183.                             goto redir;
  184.                         }
  185.                         else {
  186.                             if (selfile==offset+gadgetid) {
  187.                                 sprintf(filename,"%s%s",pathdobuffer,filedobuffer);
  188.                                 goto finished;
  189.                             }
  190.                             strcpy(filedobuffer,files[offset+gadgetid].fl_filename);
  191.                             RefreshGList(&FileSGadget,Window,NULL,1);
  192.                             selfile=offset+gadgetid;
  193.                         }                
  194.                     }
  195.                     switch (gadgetid) {
  196.                         case PARENT:
  197.                             if (pathdobuffer[(strlen(pathdobuffer)-1)]!='/') break;
  198.                             for (x=strlen(pathdobuffer)-2;x>=0;x--) {
  199.                                 if (pathdobuffer[x]=='/') {
  200.                                     for (y=0;y<x;y++) np[y]=pathdobuffer[y];
  201.                                     np[y++]='\0';
  202.                                     break;
  203.                                 }
  204.                                 else if (pathdobuffer[x]==':') {
  205.                                     for (y=0;y<=x;y++) np[y]=pathdobuffer[y];
  206.                                     np[y++]='\0';
  207.                                     break;
  208.                                 }
  209.                             }
  210.                             sprintf(pathdobuffer,"%s",np);
  211.                             goto redir;
  212.                             
  213.                         case PATH:
  214.                             if (strcmp(op,pathdobuffer)==0) break;
  215.                             goto redir;
  216.                             break;
  217.  
  218.                         case FILE:
  219.                             sprintf(filename,"%s%s",pathdobuffer,filedobuffer);
  220.                             goto finished;
  221.                             break;
  222.                             
  223.                         case CANCEL:
  224.                             fail=TRUE;
  225.                             goto finished;
  226.                             break;
  227.  
  228.                         case OKAY:
  229.                             sprintf(filename,"%s%s",pathdobuffer,filedobuffer);
  230.                             goto finished;
  231.                             break;
  232.  
  233.                         case UPDOWN:
  234.                             offset=(10*UDInfo.VertPot)/UDInfo.VertBody;
  235.                             if (offset>(filecount-10)) offset=filecount-10;
  236.                             if (offset<0) offset=0;
  237.                             DisplayFiles();
  238.                             if (((10*UDInfo.VertPot)/UDInfo.VertBody)>(filecount-10)) {
  239.                                 UDInfo.VertPot=(UDInfo.VertBody*(filecount-10))/10;
  240.                                 RefreshGList(&UDGadget,Window,NULL,1);
  241.                             }
  242.                             break;
  243.  
  244.                         default:
  245.                             break;
  246.                     }
  247.                     break;
  248.  
  249.                 case GADGETDOWN:
  250.                     gad=(struct Gadget *) FMsg->IAddress;
  251.                     gadgetid=gad->GadgetID;
  252.                     switch (gadgetid) {
  253.                         case UPDOWN:
  254.                             if (!(UDInfo.Flags&KNOBHIT)) break;
  255.                             while (MouseButton()) {
  256.                                 if (offset==((10*UDInfo.VertPot)/UDInfo.VertBody)) continue;
  257.                                 if (((10*UDInfo.VertPot)/UDInfo.VertBody)>((UDInfo.VertBody*filecount)/10))
  258.                                     continue;
  259.                                 offset=(10*UDInfo.VertPot)/UDInfo.VertBody;
  260.                                 if (offset>(filecount-10)) offset=filecount-10;
  261.                                 if (offset<0) offset=0;
  262.                                 DisplayFiles();
  263.                             }
  264.                             if (((10*UDInfo.VertPot)/UDInfo.VertBody)>(filecount-10)) {
  265.                                 UDInfo.VertPot=(UDInfo.VertBody*(filecount-10))/10;
  266.                                 RefreshGList(&UDGadget,Window,NULL,1);
  267.                             }
  268.                             break;
  269.                         case MOVEUP:
  270.                             x=0;
  271.                             --offset; if (offset<0) offset=0;
  272.                             if ((DisplayFiles())!=0)
  273.                                 UpDateProp();
  274.                             while (MouseButton()) {
  275.                                 x++;
  276.                                 if (x>250) {
  277.                                     --offset; if (offset<0) offset=0;
  278.                                     if ((DisplayFiles())!=0)
  279.                                         UpDateProp();
  280.                                     x=0;
  281.                                 }
  282.                             }
  283.                             break;
  284.                         case MOVEDOWN:
  285.                             x=0;
  286.                             ++offset; if (offset>(filecount-10)) offset=filecount-10;
  287.                             if (offset<0) offset=0;
  288.                             if ((DisplayFiles())!=0)
  289.                                 UpDateProp();
  290.                             while (MouseButton()) {
  291.                                 x++;
  292.                                 if (x>250) {
  293.                                     ++offset; if (offset>(filecount-10)) offset=filecount-10;
  294.                                     if (offset<0) offset=0;
  295.                                     if ((DisplayFiles())!=0)
  296.                                         UpDateProp();
  297.                                     x=0;
  298.                                 }
  299.                             }
  300.                             break;
  301.  
  302.                         default:
  303.                             break;
  304.                     }
  305.                     break;
  306.  
  307.                 default:
  308.                     break;
  309.             }
  310.         }
  311.     }
  312.     finished:
  313.     FreeMem(finfo,sizeof(struct FileInfoBlock));
  314.     CloseWindow(Window);
  315.     CloseLibrary(IntuitionBase);
  316.     CloseLibrary(GfxBase);
  317.     CloseLibrary(DosBase);
  318.     if (fail || strlen(filedobuffer)==0) return(NULL);
  319.     return(filename);
  320. }
  321.  
  322. DisplayFiles()
  323. {
  324.     int a=0,dy,s;
  325.     if (offset==oldoffset) return(0);
  326.     if (offset>filecount) offset=filecount-10;
  327.     dy=(oldoffset-offset)*9;
  328.     if (oldoffset=-1) dy=0;
  329.     if (dy>100) dy=100;
  330.     if (dy<-100) dy=-100;
  331.     ScrollRaster(Window->RPort,0,dy,5,25,242,125);
  332.     if (dy<0) dy=-dy; dy/=10;
  333.     if (oldoffset-offset<0) a=10-dy; else a=0;
  334.     if (oldoffset=-1) { a=0; dy=10; }
  335.     while (a+offset<filecount) {
  336.         if (a==dy) break;
  337.         if (files[offset+a].fl_filetype>0) FileGadgetText[a].FrontPen=3;
  338.         else if (files[offset+a].fl_filetype==0) FileGadgetText[a].FrontPen=2;
  339.         else FileGadgetText[a].FrontPen=1;
  340.         strcpy(FileGadgetText[a].IText,files[offset+a].fl_filename);
  341.         for (s=strlen(files[offset+a].fl_filename);s<30;s++)
  342.             strcat(FileGadgetText[a].IText," ");
  343.         RefreshGList(&FileGadget[a],Window,NULL,1);
  344.         ++a;
  345.     }
  346.     oldoffset=offset;
  347.     return(1);
  348. }
  349.  
  350. UpDateProp()
  351. {
  352.     vertpot=(UDInfo.VertBody*offset)/10;
  353.     UDInfo.VertPot=vertpot;
  354.     RefreshGList(&UDGadget,Window,NULL,1);
  355. }
  356.  
  357. MouseButton()
  358. {
  359.     return(!((USHORT)ciaa.ciapra>>6&1));
  360. }
  361.  
  362. Sort()
  363. {
  364.     int gap,i,j;
  365.     char temp[31];
  366.     int itemp;
  367.  
  368.     for (gap=filecount/2;gap>0;gap/=2)
  369.         for (i=gap;i<filecount;i++)
  370.             for (j=i-gap;j>=0;j-=gap) {
  371.                 if (mystrcmp(files[j].fl_filename,files[j+gap].fl_filename)<=0) break;
  372.                 sprintf(temp,"%s",files[j].fl_filename);
  373.                 sprintf(files[j].fl_filename,"%s",files[j+gap].fl_filename);
  374.                 sprintf(files[j+gap].fl_filename,"%s",temp);
  375.                 itemp=files[j].fl_filetype;
  376.                 files[j].fl_filetype=files[j+gap].fl_filetype;
  377.                 files[j+gap].fl_filetype=itemp;
  378.             }
  379. }
  380.  
  381. mystrcmp(s,t)
  382. char s[], t[];
  383. {
  384.     int i;
  385.     i=0;
  386.     while (toupper(s[i])==toupper(t[i]))
  387.         if (s[i++]=='\0') return(0);
  388.     return(toupper(s[i])-toupper(t[i]));
  389. }
  390.  
  391. conbstr(in,out)
  392. BSTR in;
  393. char *out;
  394. {
  395.     register UBYTE *ch;
  396.     register int len,i;
  397.     ch=(UBYTE *) BADDR(in);
  398.     len=(int) *(ch++);
  399.     len=(len>20)?20:len;
  400.     for (i=0;i<len;i++) out[i]=*(ch++);
  401.     out[i]='\0';
  402. }
  403.